package Chat.System;

import java.awt.Dimension;
import java.net.*;
import java.io.*;
import javax.swing.JProgressBar;

/**
 * TransfertFile de fichier au niveau du serveur
 *
 * @author Ndanja & Papa Abdou
 */
public class TransfertFile extends Thread {

    private ServerSocket serversocket;
    private Socket socketService;
    private File lefichier;
    private DataOutputStream dataOutput;
    private FileInputStream fInput = null;
    private int taille;
    private Boolean ack;
    private ChatController controller;
    private int port;
    private JProgressBar progress;
    private int nom;

    /**
     * Création transfert d'un fichier
     * @param port
     * @param lefichier
     */
    public TransfertFile(int port, File lefichier) {

        progress = new JProgressBar();
        progress.setPreferredSize(new Dimension(10, 10));
        taille = 0;
        ack = Boolean.FALSE;
        nom = 0;
        this.port = port;
        progress.setMaximum((int) lefichier.length());
        progress.setMinimum(0);
        progress.setValue(0);

        try {

            this.lefichier = lefichier;
            serversocket = new ServerSocket(this.port);

            //Lancement du thread propre à chaque transfert. Pour parallélliser les transferts
            start();


        } catch (IOException ex) {
            try {
                if (serversocket != null) {

                    serversocket.close();
                }

            } catch (IOException ex1) {
                System.out.println("Socket Closing error");
            }

        }
    }

    /**
     * Connaitre la taille du fichier
     * @return
     */
    public int getTailleTransfere() {

        return this.taille;
    }

    /**
     * Mettre à TRUE l'acquitement
     */
    public void setAck() {
        this.ack = Boolean.TRUE;
    }

    /**
     * Configurer le nom(numéro) du transfert
     * @param nom
     */
    public void setNom(int nom) {
        this.nom = nom;
    }

    /**
     * Récupérer le nom (numéro) du transfert
     * @return int
     */
    public int getNom() {
        return this.nom;
    }

    /**
     * Configurer la référence de ChatController
     * @param cont
     */
    public void setChatController(ChatController cont) {
        this.controller = cont;
    }

    /**
     * Configurer la référence de la barre de progression
     * @return
     */
    public JProgressBar getProgress() {
        return this.progress;
    }

    /**
     * Permet d'ouvrir un socket et d'envoyer les flux de donnée sur le réseau
     */
    @Override
    public void run() {

        while (true) {
            try {

                socketService = serversocket.accept();
                fInput = new FileInputStream(lefichier);
                dataOutput = new DataOutputStream(socketService.getOutputStream());
                byte[] tampon = new byte[1024];
                int nb_octets = 0;

                while ((nb_octets = fInput.read(tampon)) != -1) {

                    dataOutput.write(tampon, 0, tampon.length);
                    taille = taille + nb_octets;
                    progress.setValue(taille);

                }

                fInput.close();
                dataOutput.close();

            } catch (IOException ex) {
                System.out.println(ex);
            }
        }
    }
}


